package com.etrans.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class StateUtils {

	public static Map<Integer, String> stateMap = new HashMap<Integer, String>();
	static Logger logger = LoggerFactory.getLogger(StateUtils.class);
	
	static {
		// 初始化终端状态
		
		/*stateMap.put(7, "ACC关|ACC开");//第0位
		stateMap.put(6, "未定位|定位");//第1位
		stateMap.put(5, "北纬|南纬");//第2位
		stateMap.put(4, "东经|西经");//第3位
		stateMap.put(3, "运营状态|停运状态");//第4位
		stateMap.put(2, "经纬度未经保密插件加密|经纬度已经保密插件加密");//第5位
		stateMap.put(13, "车辆油路正常|车辆油路断开");//第10位
		stateMap.put(12, "车辆电路正常|车辆电路断开");//第11位
		
		stateMap.put(11, "车门解锁|车门加锁");//第12位
				
		

		stateMap.put(39, "紧急报警");//第32位
		stateMap.put(38, "超速报警");//第33位
		stateMap.put(37, "疲劳驾驶");//第34位
		stateMap.put(36, "预警");//第35位
		stateMap.put(35, "GNSS模块发生故障");//第36位
		stateMap.put(34, "GNSS天线未接或被剪断");//第37位
		stateMap.put(33, "GNSS天线短路");//第38位
		stateMap.put(32, "终端主电源欠压");//第39位
		
		stateMap.put(47, "终端主电源掉电");//第40位
		stateMap.put(46, "终端LCD或显示器故障");//第41位
		stateMap.put(45, "TTS模块故障");//第42位
		stateMap.put(44, "摄像头故障");//第43位
		
		stateMap.put(53, "当天累计驾驶超时");//第50位
		stateMap.put(52, "超时停车");//第51位		
		stateMap.put(51, "进出区域");//第52位
		stateMap.put(50, "进出路线");//第53位		
		stateMap.put(49, "路段行驶时间不足/过长");//第54位
		stateMap.put(48, "路线偏离报警");//第55位
		
		stateMap.put(63, "车辆VSS故障");//第56位
		stateMap.put(62, "车辆油量异常");//第57位
		stateMap.put(61, "车辆被盗");//第58位
		stateMap.put(60, "车辆非法点火");//第59位		
		stateMap.put(59, "车辆非法位移");//第60位
		stateMap.put(58, "碰撞侧翻报警");//第61位
		*/
		stateMap.put(7, "ACC关|ACC开");//第0位
		stateMap.put(6, "未定位|定位");//第1位
		stateMap.put(5, "北纬|南纬");//第2位
		stateMap.put(4, "东经|西经");//第3位
		stateMap.put(3, "运营状态|停运状态");//第4位
		stateMap.put(2, "经纬度未经保密插件加密|经纬度已经保密插件加密");//第5位
		stateMap.put(1, "车辆油路正常|车辆油路断开");//第6位
		stateMap.put(0, "车辆电路正常|车辆电路断开");//第7位
		
		stateMap.put(15, "车门解锁|车门加锁");//第8位
		stateMap.put(14, "前门关|前门开");//第9位
		stateMap.put(13, "后门关|后门开");//第10位
		stateMap.put(12, "车门关|车门开");//第11位
		stateMap.put(11, "发动机关|发动机开");//第12位
		stateMap.put(10, "空调关|空调开");//第13位
		stateMap.put(9, "刹车/未刹车|刹车/有刹车");//第14位
		stateMap.put(8, "左转向灯关|左转向灯开");//第15位

		stateMap.put(23, "右转向灯关|右转向灯开");//第16位
		stateMap.put(22, "远光灯关|远光灯开");//第17位
		stateMap.put(21, "近光灯关|近光灯开");//第18位
		stateMap.put(20, "震动关|震动开");//第19位
		stateMap.put(19, "喇叭关|喇叭开");//第20位
		stateMap.put(17, "空车|重车");//第22位
		stateMap.put(16, "打印机断开|打印机连接");//第23位
		
		stateMap.put(31, "防雾灯关|防雾灯开");//第24位
		stateMap.put(30, "声光报警");//第25位
		stateMap.put(29, "紧急报警");//第26位
		stateMap.put(28, "超速报警");//第27位
		stateMap.put(27, "疲劳驾驶");//第28位
		stateMap.put(26, "预警");//第29位
		stateMap.put(25, "GNSS模块发生故障");//第30位
		stateMap.put(24, "GNSS天线未接或被剪断");//第31位
		
		stateMap.put(39, "GNSS天线短路");//第32位
		stateMap.put(38, "终端主电源欠压");//第33位
		stateMap.put(37, "终端主电源掉电");//第34位
		stateMap.put(36, "终端LCD或显示器故障");//第35位
		stateMap.put(35, "TTS模块故障 ");//第36位
		stateMap.put(34, "摄像头故障 ");//第37位
		stateMap.put(33, "当天累计驾驶超时");//第38位
		stateMap.put(32, "超时停车");//第39位
		
		stateMap.put(47, "进出区域");//第40位
		stateMap.put(46, "进出路线");//第41位
		stateMap.put(45, "路段行驶时间不足/过长");//第42位
		stateMap.put(44, "路线偏离报警");//第43位
		stateMap.put(43, "车辆VSS故障");//第44位
		stateMap.put(42, "车辆油量异常");//第45位
		stateMap.put(41, "车辆被盗");//第46位
		stateMap.put(40, "车辆非法点火");//第47位
		
		stateMap.put(55, "车辆非法位移");//第48位
		stateMap.put(54, "碰撞侧翻报警");//第49位
		
		stateMap.put(63, "温度报警");//第55位
		stateMap.put(62, "地理栅栏");//第56位
		stateMap.put(61, "手柄");//第57位
		stateMap.put(60, "手柄故障");//第58位
		stateMap.put(59, "CAN总线状态");//第59位
		stateMap.put(58, "485状态");//第60位
		stateMap.put(57, "省电模式");//第61位
		stateMap.put(56, "电池拆除报警");//第62位

		stateMap.put(71, "电瓶电压低报警");//第63位
		stateMap.put(70, "电池电压低报警");//第64位
		stateMap.put(69, "密码错误报警");//第65位
		stateMap.put(68, "图像采集器");//第66位
		stateMap.put(67, "越站报警");//第67位
		stateMap.put(66, "禁止打出");//第68位
		stateMap.put(65, "禁止打入");//第69位
		stateMap.put(64, "禁止通话");//第70位

		stateMap.put(79, "停车休息时间不足报警");//第71位
		stateMap.put(78, "非法停车报警");//第72位
		stateMap.put(77, "锁车电路故障");//第73位
		stateMap.put(76, "对讲机");//第74位
		stateMap.put(75, "是否定时产生");//第75位
		stateMap.put(74, "是否定距产生");//第76位
		stateMap.put(73, "转鼓1");//第77位
		stateMap.put(72, "转鼓2");//第78位

		stateMap.put(88, "空车");//第79位
		stateMap.put(87, "半载");//第80位
		stateMap.put(86, "满载");//第81位

		stateMap.put(85, "未使用GPS卫星|使用GPS卫星定位");//第82位
		stateMap.put(84, "未使用北斗卫星定位|使用北斗卫星定位");//第83位
		stateMap.put(83, "自定义1路高传感器状态为低|自定义1路高传感器状态为高");//第84位
		stateMap.put(82, "自定义2路高传感器状态为低|自定义2路高传感器状态为高");//第85位
		stateMap.put(81, "自定义1路高传感器状态为高|自定义1路低传感器状态为低");//第86位
		stateMap.put(80, "自定义2路高传感器状态为高|自定义2路低传感器状态为低");//第87位
	}
		
	
	/**
	 * 解析用户订制的终端状态
	 * @param gpsInfoMessageState ,终端状态
	 * */
	public static Map<Integer, String> getTermianlState(Object customizeObj, String gpsInfoMessageState) {
		Map<Integer, String> newStatMap = new HashMap<Integer, String>();
		Map<Integer, String> resutlMap = new HashMap<Integer, String>();
		String[] arrayStateId = null;
		String[] arrayStateStr = null;
		if (HashMap.class == customizeObj.getClass()) {
			arrayStateId = ((Map)customizeObj).get("StateWordIDStr").toString().split(",");
			arrayStateStr =  ((Map)customizeObj).get("StateWordCustomizeStr").toString().split("[$]");			
			for (Integer i = 0; i < arrayStateId.length; i++) {
				int id = Integer.parseInt(arrayStateId[i]);
				id= ((int)(id / 8))  * 8 -1 + Math.abs(8-(id % 8));
				newStatMap.put(id,arrayStateStr[i]);
			}
		}else if (ArrayList.class == customizeObj.getClass()) {
			ArrayList<String> list = (ArrayList)customizeObj;
			Map record = null;
			String trueDesc,falseDesc;
			for (int i = 0; i<list.size(); i++) {
				record = JSONUtils.fromJson(list.get(i), Map.class);
				trueDesc = record.get("TrueDesc") == null ? " " : record.get("TrueDesc").toString();
				falseDesc = record.get("FalseDesc") == null ? " " : record.get("FalseDesc").toString();
				int id = Integer.parseInt(record.get("ID").toString());
				id= ((int)(id / 8))  * 8 -1 + Math.abs(8-(id % 8));
				newStatMap.put(id, falseDesc+"|" + trueDesc);				
			}
		}
		
		//gpsInfoMessageState=Tools.getByteHex(gpsInfoMessageState);//16进制字符转成16进制ASCII码	
		//后台不作个性化过滤，解析所有状态
		try
		{
		// 终端状态解析
			String terminalStateBinary = getTerminalStateBinary(gpsInfoMessageState);
	        String gpsStateString=getGpsState(terminalStateBinary, (newStatMap == null ? stateMap : newStatMap));
	        resutlMap.put(1, gpsStateString);
	        
			String alarmStateString=getAlarmsState(terminalStateBinary, (newStatMap == null ? stateMap : newStatMap));
			if(alarmStateString==null ||"".equals(alarmStateString)){
				
				 resutlMap.put(2, "当前没有报警");
			}else{
				resutlMap.put(2, alarmStateString);
			}	
			char[] terminalStateArray = terminalStateBinary.toCharArray();
			if(terminalStateArray.length > 6)
				resutlMap.put(3, String.valueOf(terminalStateArray[7]));
			else {
				resutlMap.put(3,"0");
			}
		}catch (Exception e){
			logger.error(gpsInfoMessageState,e);
			logger.error(e.getMessage(),e);
		}
		return resutlMap;
	}


	
	
	
	/**
	 * 将16进制的终端状态转换成2进制
	 * @param gpsInfoMessageState ,16进制的终端状态
	 * @return 2进制的终端状态
	 * */
	public static String getTerminalStateBinary(String gpsInfoMessageState) 
	{
		if (gpsInfoMessageState == null) {
			return "";
		}
		StringBuffer terminalState = new StringBuffer();
		for (int i = 0; i < gpsInfoMessageState.length(); i = i + 2) 
		{
			try {
				String temp = Long.toBinaryString(Long.parseLong(Long.valueOf(gpsInfoMessageState.substring(i, i + 2), 16).toString()));
				terminalState.append("00000000".substring(0, (8 - temp.length())) + temp);
			} catch (NumberFormatException e) {
				e.printStackTrace();
				terminalState.append("00000000");
			}
		}
		return terminalState.toString();
	}

	/**
	 * 解析用户所订制的终端状态结果
	 * @param terminalStateBinary ,2进制的终端状态
	 * @param stateMap ,终端状态的MAP
	 * @param userTerminalState ,用户订制的终端状态
	 * @return 用户所订制的终端状态结果
	 * */
	public static String getGpsState(String terminalStateBinary, Map<Integer, String> stateMap) {
		StringBuffer stateStr = new StringBuffer();
		try{
			if(null == terminalStateBinary || "".equals(terminalStateBinary)){
				return "";
			}
			//修改终端状态解析不正确，欧阳治平 2015-02-06
			char[] terminalStateArray = terminalStateBinary.toCharArray();
			String temp = "";
			for (int s =0; s<24; s++){
				if (null != stateMap.get(s)) {
					   try {
						   temp = String.valueOf(stateMap.get(s)).split("\\|")[Integer.parseInt(String.valueOf(terminalStateArray[s]))];
						   if (!temp.equals("")) {
							   if (stateStr.length() > 0) {
								   stateStr.append(",");
							   }
							   stateStr.append(temp);
						   }
					} catch (Exception e) {
						logger.error(stateMap.get(s));
					}  		
				}
			}
			for (int s =80; s<=85; s++){
				if (null != stateMap.get(s)) {
					if(Integer.parseInt(String.valueOf(terminalStateArray[s]))==1){
					   temp = String.valueOf(stateMap.get(s)).split("\\|")[Integer.parseInt(String.valueOf(terminalStateArray[s]))];
					   if (!temp.equals("")) {
						   if (stateStr.length() > 0) {
							   stateStr.append(",");
						   }
						   stateStr.append(temp);
					   }
					}
				}
			}
		}catch (Exception e){
			logger.error("获取车辆状态字出错"+terminalStateBinary,e);
			logger.error(e.getMessage(),e);
		}
		return stateStr.toString().replace("[?]", "");
	}
	
	
	/**
	 * 解析报警状态
	 * @param terminalStateBinary ,2进制的终端状态
	 * @param stateMap ,终端状态的MAP
	 * @param userTerminalState ,用户订制的终端状态
	 * @return 用户所订制的终端状态结果
	 * */
	public static String getAlarmsState(String terminalStateBinary, Map<Integer, String> stateMap) {
		StringBuffer stateStr = new StringBuffer();
		try
		{
			if(null == terminalStateBinary || "".equals(terminalStateBinary)){
				return "";
			}
			char[] terminalStateArray = terminalStateBinary.toCharArray();
			String tmp = "";
			for (int s =24; s<=55; s++)
			{
				if (null != stateMap.get(s)) {
					 if(Integer.parseInt(String.valueOf(terminalStateArray[s]))==1){
						 tmp = stateMap.get(s);
						 if (!tmp.equals("")) {
							 if (stateStr.length() > 0) {
								 stateStr.append(","); 
							}
							 stateStr.append(tmp);
						}
					   }
				}
			}
			/*
			for (int s =80; s<=85; s++) 
			{
				if (null != stateMap.get(s)) {
					if(Integer.parseInt(String.valueOf(terminalStateArray[s]))==1){
						stateStr.append(String.valueOf(stateMap.get(s)).split("\\|")[Integer.parseInt(String.valueOf(terminalStateArray[s]))]);
						stateStr.append(",");
					}
				}
			} */
		}catch (Exception e) {
			logger.error("获取报警状态字出错"+terminalStateBinary,e);
			logger.error("获取报警状态字出错"+e.getMessage(),e);
		}
		return stateStr.toString().replace("[?]", "");
	}
	
	
	
	public static void main(String args[])
	{
//	     for(int i=0;i<10;i++){
//	   L:  if(i==5)
//    	   {
//    		  break L;
//    	   }
//    	   System.out.println(i);
//		}
		
		/**16进制转换成十进制再转换成二进制数**/
//		String gpsInfoMessageState = "4100000000000000000000000000000000000000000000000000000000000000";
		String gpsInfoMessageState = "41";
		
		StringBuffer terminalState = new StringBuffer();
		for (int i = 0; i < gpsInfoMessageState.length(); i = i + 1) 
		{
			String ss = gpsInfoMessageState.substring(i, i + 1);
			String aa = Long.valueOf(ss, 16).toString();
			Long bb = Long.parseLong(aa);
			String temp = Long.toBinaryString(bb);
			terminalState.append("0000".substring(0, (4 - temp.length())) + temp);
		}

		System.out.println(terminalState.toString());
//		
//		/**16进制转换成二进制数**/
//		String str="41";
//		int i=Integer.parseInt(str,16);
//		String str2=Integer.toBinaryString(i);
//		System.out.println(str2);
//		
//		String terminalStateBinary = "01000001";
//		char[] terminalStateArray = terminalStateBinary.toCharArray();
//		String ee = String.valueOf(terminalStateArray[0]);
//		System.out.println(ee);
	} 
	
	

	
}
